본 게시글의 원문은 Yann Debray의 MATLAB with Python Book 입니다. 해당 책은 MIT 라이센스를 따르기 때문에 개인적으로 번역하여 재배포 합니다. 본 포스팅에는 추후 유료 수익을 위한 광고가 부착될 수도 있습니다.

MIT License

Copyright (c) 2023 Yann Debray

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

본 게시물에서 활용된 소스 코드들은 모두 Yann Debray의 GitHub Repo에서 확인할 수 있습니다.

첫 번째 시나리오에서는 Python을 사용하여 컴퓨터 비전을 위한 알고리즘이 개발되었으며, 시뮬레이션을 위해 더 큰 시스템에 통합해야 합니다.

7.1.1. Simulink용 Python 임포터

Simulink 23a에서 우리는 Python 임포터라는 새로운 기능을 출시했습니다. 이를 통해 Python 함수를 Simulink에 라이브러리 블록으로 쉽게 가져올 수 있습니다. 단계별 지침을 제공하는 그래픽 마법사를 제공합니다. 이 데모에서는 Python에서 OpenCV를 호출하는 Python 인간 탐지 알고리즘을 사용합니다.

임포터는 다음 단계를 안내합니다:

환영 > 설정 > 사용자 정의 코드 지정 > 분석 > 임포트 > Simulink 라이브러리 생성

Python 임포터를 사용하면 모델링, 검증 및 검증을 위한 사용자 정의 코드를 임포트할 수 있습니다.

Python 임포터:

  • 함수, 타입 및 그들의 종속성을 분석합니다.
  • 호출 가능한 함수와 타입을 포함하는 Simulink 라이브러리에 사용자 정의 코드를 임포트합니다.

설정

사용자 정의 코드 지정

분석

라이브러리가 생성되며 새 다이어그램에 드래그 앤 드롭할 수 있습니다.

7.1.2. MATLAB 함수와 시스템 객체

23a 이전에는 Simulink 블록 내에서 Python을 호출하는 두 가지 방법이 있었습니다:

  • MATLAB 함수 사용
  • MATLAB 시스템 객체 사용

두 경우 모두 py. 접두사를 사용하여 Python 코드를 래핑합니다.

첫 번째 옵션은 MATLAB 함수를 사용하는 것입니다. 유일한 요령은 Simulink 시뮬레이션을 위한 코드를 생성하지 않고 MATLAB을 명시적으로 호출하도록 지정하는 coder.extrinsic 함수입니다. 블록을 더블 클릭하면 다음 코드를 볼 수 있습니다:

function y = fcn(u)
    coder.extrinsic('py.detectHuman.getHogObject')
    coder.extrinsic('py.detectHuman.detectHumanFromFrame')
    
    persistent hog;
    if isempty(hog)
        hog = py.detectHuman.getHogObject();
    end
    
    out = py.detectHuman.detectHumanFromFrame(u, hog);
    
    y = uint8(out);
end

두 번째 옵션은 MATLAB 시스템 블록을 사용하는 것입니다. 이를 설정하려면 “Simulate using: Interpreted execution”으로 설정해야 합니다. 이 두 옵션 모두 Python을 위한 코드를 생성할 수 없습니다.

이 MATLAB 시스템의 소스 코드는 객체 지향 프로그래밍 패러다임을 따릅니다:

classdef python_HumanDetector < matlab.System
    % 사전 계산된 상수
    properties(Access = private, Nontunable)
        hog
    end

    methods(Access = protected)
        function setupImpl(obj)
            % 상수를 계산하는 등 일회성 계산 수행
            obj.hog = py.detectHuman.getHogObject();
        end

        function y = stepImpl(obj,u)
            % 입력 u와 이산 상태의 함수로 y 계산
            out = py.detectHuman.detectHumanFromFrame(u, obj.hog);
            y = uint8(out);
        end

        function out = getOutputSizeImpl(obj)
            out = [300 400 3];
        end
        
        function y1 = getOutputDataTypeImpl(obj)
            y1 = 'uint8';
        end
        
        function y1 = isOutputComplexImpl(~)
            y1 = false;
        end
        
        function out = isOutputFixedSizeImpl(obj)
            out = true;
        end

    end
end

이 접근 방식의 한계는 임베디드 시스템을 위한 코드를 생성할 수 없다는 점입니다.